# 导入flask
from flask import Flask, request, render_template
# 导入datetime
from datetime import datetime
# 导入数据库
from flask_sqlalchemy import SQLAlchemy
# 导入text
from sqlalchemy import text
# 导入数据库迁移
from flask_migrate import Migrate

# 创建flask应用
app = Flask(__name__)
# 数据库host
HOSTNAME = 'jms.antalpha.com'
# 数据库端口
PORT = "33061"
# 数据库账号
USERNAME = '702b0573-91f8-4f1d-98e1-01bb32b75aae'
# 数据库密码
PASSWORD = 'NT7czo0Lx86sPmEY'
# 数据库名称
DATABASE = 'prime_invest'
# 数据库连接地址
app.config[
    'SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8'

# 配置数据库连接地址
db = SQLAlchemy(app)

# 配置数据库迁移
migration = Migrate(app, db)
# ORM模型映射成表的三步
# 1.flask db init 只需要执行一次，初始化迁移环境
# 2.flask db migrate -m 'init' 生成迁移脚本
# 3.flask db upgrade 执行迁移脚本，映射到数据库
# 4.如果修改了模型，重复2和3步骤
# 5.如果需要回滚，flask db downgrade 回滚只回滚表结构，数据清空





# with app.app_context():
#     # 定义用户模型
#     with db.engine.connect() as conn:
#         # SQLAlchemy 期望一个可执行的对象，而不是一个简单的字符串。在 SQLAlchemy 中，execute 方法需要一个可执行的 SQL 表达式对象，而不是原生的 SQL 字符串。
#         # 为了修正这个问题，你需要使用 SQLAlchemy 的 text 函数来创建一个可执行的 SQL 表达式对象。
#         rs = conn.execute(text('SELECT * FROM user_balance WHERE user_id = :user_id'), {'user_id': 30086})
#         print(rs.fetchone())

class User_db(db.Model):
    # 定义表名
    __tablename__ = 'zzz_user_balance'
    # 定义字段 主键ID，自增形式
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 定义字段
    user_id = db.Column(db.Integer)
    # 定义字段
    balance = db.Column(db.Float)
    emalil = db.Column(db.String(100))




# 定义文章模型
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 不能为空
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 默认值 添加外键 应用的是user_db表的id字段
    author_id = db.Column(db.Integer, db.ForeignKey('zzz_user_balance.id'))
    # 添加外键关联 自动绑定User_db表，增加articles属性
    author = db.relationship("User_db", backref='articles')


# 定义用户模型
article = Article(title='aaa', content='bbb')
# 通过外键查询用户
# user = User_db.query.get(article.author_id)
# print(article.author_id)








# sql：insert user(user_id, balance) values(300861, 100)
# user = User(user_id=300861, balance=100)

# 创建表
with app.app_context():
    db.create_all()


# 添加用户
@app.route('/user/add')
def add_user():
    user = User_db()
    user.user_id = 300861
    user.balance = 100
    db.session.add(user)
    db.session.commit()
    return '添加成功'


# 查询用户
@app.route('/user/query')
def query_user():
    # get(数据库主键id)方法返回主键对应的行，如果没有找到，则返回None
    # user = User_db.query.get(1)
    # return f'用户id：{user.user_id}，用户余额：{user.balance}'
    # filter_by()方法返回满足条件的行，如果没有找到，则返回None
    user = User_db.query.filter_by(user_id=300861).first()
    print(type(user))
    return f'用户id：{user.user_id}，用户余额：{user.balance}'


# 更新用户
@app.route("/user/update")
def update_user():
    # filter_by()方法返回满足条件的行，如果没有找到，则返回None
    user = User_db.query.filter_by(user_id=300861).first()
    user.balance = 200
    db.session.commit()
    return "数据更新成功"


# 删除用户
@app.route("/user/delete")
def delete_user():
    # filter_by()方法返回满足条件的行，如果没有找到，则返回None
    user = User_db.query.filter_by(user_id=300861).first()
    # 删除用户
    db.session.delete(user)
    # 提交事务，同步数据库
    db.session.commit()
    return "数据删除成功"


@app.route('/article/add')
def add_article():
    article1 = Article(title='aaa1', content='bbb1')
    article1.author = User_db.query.get(2)

    article2 = Article(title='aaa2', content='bbb2')
    article2.author = User_db.query.get(2)

    db.session.add_all([article1, article2])
    db.session.commit()
    return '文章添加成功'


@app.route('/article/query')
def query_article():
    article = Article.query.get(1)
    return f'文章标题：{article.title}，作者：{article.author.balance}'





# 时间格式化过滤器
def datetime_format(value, format="%Y年-%m月-%d日 %H时:%M分:%S秒"):
    return value.strftime(format)


# 注册过滤器
app.add_template_filter(datetime_format, 'dformat')


# 自定义过滤器
class User:
    def __init__(self, username, email):
        self.username = username
        self.email = email


# 注册过滤器
@app.route('/')
def hello_world():
    user = User("admin", "admin@gmail.com")
    person = {
        "name": "admin",
        "email": "jiade,wu@antalpha.com"
    }
    return render_template('index.html', user=user, person=person)


# 注册过滤器
@app.route('/blog/<int:blog_id>')
def blog_id(blog_id):
    return render_template("blog_detail.html", blog_id=blog_id, username="admin")


@app.route('/filter')
def hello_demo():
    user = User("admin", "admin@gmail.com")
    # 获取当前时间，然后通过时间过滤器格式化时间
    mytime = datetime.now()
    return render_template('filter.html', user=user, mytime=mytime)


# 注册过滤器
@app.route('/control/<int:age>')
def control_statement(age):
    # age = 17
    books = [{
        "name": "Python",
        "price": 99
    }, {
        "name": "Java",
        "price": 88
    }, {
        "name": "C++",
        "price": 77
    }]
    return render_template("control.html", age=age, books=books)


@app.route("/child1")
def child1():
    return render_template("child1.html")


@app.route("/child2")
def child2():
    return render_template("child2.html")


@app.route("/static")
def static_demo():
    return render_template("static.html")


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5555)
